Jenkins - 安装和配置
持续集成流程说明

- 首先,开发人员每天进行代码提交,提交到 Git 仓库
- 然后,Jenkins 作为持续集成工具,使用 Git 工具到 Git 仓库拉取代码到集成服务器,再配合 JDK,Maven 等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程
- 最后,Jenkins 把生成的 jar 或 war 包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用
Gitlab 代码托管服务器安装
Gitlab 简介

官网: https://about.gitlab.com/。
GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 Web 服务。
GitLab 和 GitHub 一样属于第三方基于 Git 开发的作品,免费且开源(基于 MIT 协议),与 Github 类似, 可以注册用户,任意提交你的代码,添加 SSH Key 等等。不同的是,GitLab 是可以部署到自己的服务器上,数据库等一切信息都掌握在自己手上,适合团队内部协作开发,你总不可能把团队内部的智慧总放在别人的服务器上吧?简单来说可把 GitLab 看作个人版的 GitHub。
在 SSH 下安装
官方安装文档:https://gitlab.cn/install/?version=ce
安装依赖
sudo yum install -y curl policycoreutils-python openssh-server perl
sudo systemctl enable sshd
sudo systemctl start sshd配置镜像
curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash开始安装
sudo EXTERNAL_URL="http://192.168.44.103" yum install -y gitlab-jh除非您在安装过程中指定了自定义密码,否则将随机生成一个密码并存储在 /etc/gitlab/initial_root_password 文件中(出于安全原因,24 小时后,此文件会被第一次 gitlab-ctl reconfigure 自动删除,因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码)。使用此密码和用户名 root 登录。
GitLab 常用命令
gitlab-ctl start # 启动所有 gitlab 组件;
gitlab-ctl stop # 停止所有 gitlab 组件;
gitlab-ctl restart # 重启所有 gitlab 组件;
gitlab-ctl status # 查看服务状态;
gitlab-ctl reconfigure # 启动服务;
vi /etc/gitlab/gitlab.rb # 修改默认的配置文件;
gitlab-ctl tail # 查看日志;在 Docker 下安装
https://docs.gitlab.cn/jh/install/docker.html
安装所需最小配置
- 内存至少 4G
- 系统内核至少在 3.10 以上
uname -r命令可查看系统内核版本
安装 Docker
- 更新 yum 源
yum update- 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2- 添加镜像
# 国外镜像
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 阿里镜像
https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo- 查看源中可使用版本
yum list docker-ce --showduplicates | sort -r- 安装指定版本
yum install docker- 配置开机启动项
systemctl start docker
systemctl enable docker
docker version使用容器安装 GitLab
- 添加容器
docker run --detach \
--hostname 192.168.44.103 \
--publish 443:443 --publish 80:80 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab:Z \
--volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
--volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
--shm-size 256m \
registry.gitlab.cn/omnibus/gitlab-jh:latest- 启动容器
docker start gitlab- 查看已存在的容器
docker ps -a- 进入容器
docker exec -it gitlab /bin/bash访问
当首次运行出现 502 错误的时候排查两个原因
- 虚拟机内存至少需要 4G
- 稍微再等等刷新一下可能就好了

管理员账号登录
用户名:root
密码存在下面文件中,登录后需要改密码不然 24 小时之后会失效
cat /etc/gitlab/initial_root_passwordJDK 安装
检索可用包
yum search java|grep jdk安装
yum install java-1.8.0-openjdk首次启动 W ar 包会在 /root/.jenkins 生成配置文件
待完全启动成功后 访问服务器 8080 端口完成配置
初始化后的密码:
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
4e67bbe261da476abdc63c5b51311646
This may also be found at: /root/.jenkins/secrets/initialAdminPassword密码文件使用后会自动删除。
jenkins 安装
官方文档介绍非常详细:https://www.jenkins.io
下载页面:https://jenkins.io/zh/download/
Jenkins 插件管理
Jenkins 本身不提供很多功能,我们可以通过使用插件来满足我们的使用。例如从 Gitlab 拉取代码,使用 Maven 构建项目等功能需要依靠插件完成。接下来演示如何下载插件。
修改 Jenkins 插件下载地址
Jenkins 国外官方插件地址下载速度非常慢,所以可以修改为国内插件地址:
Jenkins -> Manage Jenkins -> Manage Plugins,点击 Available,此时他会把 Jenkins 官方的插件列表下载到本地,等下载完后,我们就修改为国内地址。
先进入插件地址
cd /var/lib/jenkins/updates复制下面命令,切换国内地址:
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json最后在 Manage Plugins 点击 Advanced,把 Update Site 改为国内插件下载地址:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.jsonSumbit 后,在浏览器输入: http://112.74.169.231:8087/restart,重启 Jenkins。
下载中文汉化插件
Jenkins -> Manage Jenkins -> Manage Plugins,点击 Available,搜索 Chinese,然后点击 Install without restart 进行安装。
最后重启 Jenkins 后,就看到 Jenkins 汉化了。(PS:但可能部分菜单汉化会失败)
Jenkins 用户权限管理
我们可以利用 Role-based Authorization Strategy 插件来管理 Jenkins 用户权限。
先去安装 Role-based Authorization Strategy 插件

开启权限全局安全配置

授权策略切换为「Role-Based Strategy」,保存
创建角色
在系统管理页面进入 Manage and Assign Roles

点击 Manage Roles

- Global roles(全局角色):管理员等高级用户可以创建基于全局的角色
- Project roles(项目角色):针对某个或者某些项目的角色 Slave roles(奴隶角色):节点相关的权限
我们添加以下三个角色:
- baseRole:该角色为全局角色。这个角色需要绑定 Overall 下面的 Read 权限,是为了给所有用户绑定最基本的 Jenkins 访问权限。注意:如果不给后续用户绑定这个角色,会报错误:
用户名 is missing the Overall/Read permission - role1:该角色为项目角色。使用正则表达式绑定
kbt.*,意思是只能操作 kbt 开头的项目 - role2:该角色也为项目角色。绑定
youngkbt.*,意思是只能操作 youngkbt 开头的项目
创建用户
在系统管理页面进入 Manage Users,接着点击新建用户,分别创建两个用户:jack 和 eric。
给用户分配角色
系统管理页面进入 Manage and Assign Roles,点击 Assign Roles。
绑定规则如下:
- eric 用户分别绑定 baseRole 和 role1 角色
- jack 用户分别绑定 baseRole 和 role2 角色
创建项目测试权限
以 youngkbt 管理员账户创建两个项目,分别为 kbt01 和 youngkbt01
结果为:
- eric 用户登录,只能看到 kbt01 项目
- jack 用户登录,只能看到 youngkbt01 项目
Jenkins 凭证管理
凭据可以用来存储需要密文保护的数据库密码、Gitlab 密码信息、Docker 私有仓库密码等,以便 Jenkins 可以和这些第三方的应用进行交互。
Credentials Binding 插件
要在 Jenkins 使用凭证管理功能,需要安装 Credentials Binding 插件。

安装插件后,左边多了 凭证 菜单,在这里管理所有凭证。

可以添加的凭证有 5 种:

- Username with password:用户名和密码
- SSH Username with private key:使用 SSH 用户和密钥
- Secret file:需要保密的文本文件,使用时 Jenkins 会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的 Secret file 就会被删除
- Secret text:需要保存的一个加密的文本串,如钉钉机器人或 Github 的 api token
- Certificate:通过上传证书文件的方式
常用的凭证类型有:Username with password(用户密码)和 SSH Username with private key(SSH 密钥)
接下来以使用 Git 工具到 Gitlab 拉取项目源码为例,演示 Jenkins 的如何管理 Gitlab 的凭证。
安装 Git 插件和 Git 工具
为了让 Jenkins 支持从 Gitlab 拉取源码,需要安装 Git 插件以及在 CentOS 7 上安装 Git 工具。
Git 插件安装:

CentOS7 上安装 Git 工具:
yum install git -y # 安装
git --version # 安装后查看版本用户密码类型
创建凭证
Jenkins -> 凭证 -> 系统 -> 全局凭证 -> 添加凭证


选择 Username with password,输入 Gitlab 的用户名和密码,点击确定。
测试凭证是否可用
创建一个 FreeStyle 项目:新建 Item -> FreeStyle Project -> 确定。
找到 源码管理 -> Git,在 Repository URL 复制 Gitlab 中的项目 URL


因为项目的分支是 master 分支,所以下面的地址改为 */master

保存配置后,点击构建 Build Now 开始构建项目


查看 /var/lib/jenkins/workspace/ 目录,发现已经从 Gitlab 成功拉取了代码到 Jenkins 中。
SSH 密钥类型
SSH 免密登录示意图

使用 root 用户生成公钥和私钥
ssh-keygen -t rsa在 /root/.ssh/ 目录保存了公钥和使用
- id_rsa:私钥文件
- id_rsa.pub:公钥文件
把生成的公钥放在 Gitlab 中
以 root 账户登录 -> 点击头像 -> Settings -> SSH Keys
复制刚才 id_rsa.pub 文件的内容到这里,点击 Add Key
在 Jenkins 中添加凭证,配置私钥
在 Jenkins 添加一个新的凭证,类型为 SSH Username with private key,把刚才生成私有文件内容复制过来

测试凭证是否可用
新建 test02 项目 -> 源码管理 -> Git,这次要使用 Gitlab 的 SSH 连接,并且选择 SSH 凭证。
同样尝试构建项目,如果代码可以正常拉取,代表凭证配置成功。
Maven 安装和配置
在 Jenkins 集成服务器上,我们需要安装 Maven 来编译和打包项目。
安装 Maven
先上传 Maven 压缩包到服务器
tar -xzf apache-maven-3.6.2-bin.tar.gz # 解压
mkdir -p /opt/maven # 创建目录
mv apache-maven-3.6.2/* /opt/maven # 移动文件配置环境变量
vi /etc/profileexport JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export MAVEN_HOME=/opt/maven
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/binsource /etc/profile # 配置生效
mvn -v # 查看 Maven 版本全局工具配置关联 JDK 和 Maven
Jenkins -> Global Tool Configuration -> JDK -> 新增 JDK,配置如下:

Jenkins -> Global Tool Configuration -> Maven -> 新增 Maven,配置如下:

添加 Jenkins 全局变量
Manage Jenkins -> Configure System -> Global Properties,添加三个全局变量 JAVA_HOME、M2_HOME、PATH+EXTRA

修改 Maven 的 settings.xml
mkdir /root/repo # 创建本地仓库目录
vi /opt/maven/conf/settings.xml本地仓库改为:/root/repo/
添加阿里云私服地址:
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>测试 Maven 是否配置成功
使用之前的 Gitlab 密码测试项目,修改配置:
构建 -> 增加构建步骤 -> Execute Shell

输入
mvn clean package
再次构建,如果可以把项目打成 War 包,代表 Maven 环境配置成功啦。
Tomcat 安装和配置
安装 Tomcat8.5。
把 Tomcat 压缩包上传到服务器
tar -xzf apache-tomcat-8.5.47.tar.gz # 解压
mkdir -p /opt/tomcat # 创建目录
mv /root/apache-tomcat-8.5.47/* /opt/tomcat # 移动文件
/opt/tomcat/bin/startup.sh # 启动tomcat注意:服务器已经关闭了防火墙,所以可以直接访问 Tomcat 啦。
地址为:http://IP 地址:8080
配置 Tomcat 用户角色权限
默认情况下 Tomcat 是没有配置用户角色权限的。

但是,后续 Jenkins 部署项目到 Tomcat 服务器,需要用到 Tomcat 的用户,所以修改 Tomcat 以下配置,添加用户及权限
vi /opt/tomcat/conf/tomcat-users.xml内容如下:
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,managerscript,tomcat,admin-gui,admin-script"/>
</tomcat-users>用户和密码都是:tomcat。
注意:为了能够刚才配置的用户登录到 Tomcat,还需要修改以下配置:
vi /opt/tomcat/webapps/manager/META-INF/context.xml<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->把上面这行注释掉即可。
重启 Tomcat,访问测试
/opt/tomcat/bin/shutdown.sh # 停止
/opt/tomcat/bin/startup.sh # 启动访问:http://IP地址:8080/manager/html,看到以下页面代表成功啦。
